/******************************************************************************
** 公司名称：天津柯迪斯科技有限公司
** 版权信息：
** 文件名称： App_Protocol_KDS_CAN_V13.h
** 模块名称： 柯迪斯CAN-V1.3协议处理模块
** 版 本 号： V1.0
** 作    者： 蒲磊
**
** 修改记录： 版本     修改人      时间         修改内容
******************************************************************************/
#ifndef __APP_PROTOCOL_KDS_CAN_V13_H_
#define __APP_PROTOCOL_KDS_CAN_V13_H_

/******************************************************************************
* 头文件
******************************************************************************/
#include "bsp.h"
/******************************************************************************
* 宏定义 ('#define')
******************************************************************************/
#define CAN_LOOP_CYCLE              20      /*vPROTOCOL_Loop()函数的循环调用周期，单位：ms*/
#define gxCAN_RxQueue               0x00    /*Can接收FIFO队列ID*/
#define gxCAN_TxQueue               0x01    /*Can发送FIFO队列ID*/
#define gxCAN_RxQueue_Len           (sizeof(can_rx_message_type) * 30)    /*FIFO长度，30个元素长度*/
#define gxCAN_TxQueue_Len           (sizeof(can_tx_message_type) * 30)
/******************************************************************************
* 类型定义 ('typedef')
******************************************************************************/
/*设备ID类型*/
typedef enum
{
    ID_DP           = 0x01,        /*仪表*/
    ID_MCU          = 0x10,        /*控制器*/
    ID_BMS          = 0x20,        /*BMS*/

} enuDEVICE_ID;


/*控制器消息结构体*/
typedef struct
{
    uint16_t    Speed_Cnt;              /*车速计数，即车轮转动一周的毫秒数，最大3500（0x0DAC）*/
    uint8_t     Current;                /*电流值，单位0.2A*/
    uint8_t     ErrorCode;              /*故障代码*/
    int8_t      MCU_Temp;               /*控制器内部温度，-127-127*/
    int8_t      MOTO_Temp;              /*电机温度，-127-127*/
    uint16_t    MOTO_Ratio;             /*电机传动比*/
} strMCUInfo;

/*BMS消息结构体*/
typedef struct
{
    uint16_t    Voltage;                /*总电压，mV*/
    int16_t     Current;                /*总电流，mA，充电为正，放电为负*/
    int8_t      Soc;                    /*电量百分比*/

} strBatteryInfo;

/*仪表消息结构体*/
typedef struct
{
    uint8_t     WheelSize;              /*轮径，数据值小于35时，代码轮径，单位Inch，有效范围8-34，大于50时，代表轮周长，单位cm，有效范围51-255*/
    uint16_t    Wheel_Length;           /*轮周长，单位mm*/
    uint8_t     Speed_Limit;            /*限速值，单位km/h*/
    uint8_t     Current_Limit;          /*限流值，0.1A*/

    uint8_t		Lamp;                   /*大灯状态*/
    uint8_t		Walk;                   /*助推状态*/
    uint8_t		Pas;                    /*档位*/
    uint8_t     Max_PWM;                /*当前挡位的最大PWM值*/
    uint8_t     Battery_Low;            /*电池欠压标志，5S协议有*/
    uint8_t     Assistant_Num;          /*助力磁钢数*/
    uint8_t     Speed_Sensor_Num;       /*测速磁钢数量*/
    uint8_t     Slow_Start;             /*缓启动参数*/
    uint8_t     Handle_Walk;            /*转把是否带助推*/
    uint8_t     Handle_Segement;        /*转把是否分档*/
    uint8_t     Over_Speed;             /*超速标志*/
    uint8_t     Throttle_Percent;       /*转把油门百分比*/
} strDisplayInfo;

/*定义车辆信息结构体*/
typedef    struct
{
    strBatteryInfo    Battery;
    strMCUInfo		  MCU;
    strDisplayInfo    Display;
    uint8_t			  ErrCode;

} strBikeInfo;

typedef enum
{
    Send_Stop 			= 0,
    Send_Run_Data,
    Send_Config_Data,
    Send_Config_Data_OneTime,
} enSEND_DATA_TYPE;

/******************************************************************************
* 全局变量声明
******************************************************************************/

/******************************************************************************
* 函数声明
******************************************************************************/
void vPROTOCOL_Init(void);
void vPROTOCOL_Loop(void);
void vPROTOCOL_Send_Run_Data(void);
void vPROTOCOL_Send_Config_Data(void);
void vPROTOCOL_Send_Config_Data_OneTime(void);

void vCAN_CanMsgToUserMsg(can_rx_message_type *pCanMessage);


void vPROTOCOL_Set_Lamp(uint8_t State);
void vPROTOCOL_Set_Pas(int8_t Pas);
void vPROTOCOL_Set_Speed_Limit(uint8_t Speed);
void vPROTOCOL_Set_Wheel(uint8_t Wheel);
void vPROTOCOL_Set_Current_Limit(uint16_t Current_Limit);
void vPROTOCOL_Set_Battery_Low(uint8_t Battery_Low);
void vPROTOCOL_Set_Battery_Idle(void);
void vPROTOCOL_Set_Assistant_Num(uint8_t Assistant_Num);
void vPROTOCOL_Set_Speed_Sensor_Num(uint8_t Speed_Sensor_Num);
void vPROTOCOL_Set_Slow_Start(uint8_t SlowStart);
void vPROTOCOL_Set_Handle_Walk(uint8_t Handle_Walk);
void vPROTOCOL_Set_Handle_Segement(uint8_t Handle_Segement);
void vPROTOCOL_Set_Value_When_ExitSetting(void);
void vPROTOCOL_Set_Value_When_PowerOn(void);

uint16_t    usPROTOCOL_Get_Current(void);
uint16_t    usPROTOCOL_Get_Speed(void);
uint8_t     ucPROTOCOL_Get_Errcode(void);
int8_t       cPROTOCOL_Get_Soc(void);

uint16_t    usPROTOCOL_Get_BMS_Voltage(void);
int16_t      sPROTOCOL_Get_BMS_Current(void);
uint8_t     ucPROTOCOL_Get_BMS_SOH(void);
int8_t       cPROTOCOL_Get_BMS_SOC(void);
uint16_t    usPROTOCOL_Get_BMS_ResCap(void);
uint8_t     ucPROTOCOL_Get_BMS_CycleTimes(void);
uint8_t     ucPROTOCOL_Get_BMS_SeriesNum(void);
uint8_t     ucPROTOCOL_Get_BMS_ParallelNum(void);
uint16_t    usPROTOCOL_Get_BMS_Cell_Voltage(uint8_t CellNum);


void vPROTOCOL_Send(void);
void vPROTOCOL_ResetCommunicationOverTime(void);



void vPROTOCOL_Factory_Command(can_rx_message_type *pCanRxMsg);

#endif
